﻿using System;
using System.Collections.Generic;
using System.Data.OleDb;
using System.Linq;
using System.Web;

namespace FlyingCircusWebIS.Models
{
    public class CidadeDAO: ICidadeDAO
    {

        public void Adicionar(Cidade entidade)
        {
            string sqlInserir = "insert into Cidade (IdCidade, NomeCidade, UF, Pais) values (seqCidade.NEXTVAL, ?, ?, ?)";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlInserir;

            OleDbParameter pNomeCidade = new OleDbParameter("NomeCidade", OleDbType.VarChar);
            pNomeCidade.Value = entidade.NomeCidade;
            comando.Parameters.Add(pNomeCidade);

            OleDbParameter pUF = new OleDbParameter("UF", OleDbType.VarChar);
            pUF.Value = entidade.UF;
            comando.Parameters.Add(pUF);

            OleDbParameter pPais = new OleDbParameter("Pais", OleDbType.VarChar);
            pPais.Value = "Brasil";  // A priori o sistema será apenas nacional, em uma versão futura poderá ter suporte internacional
            comando.Parameters.Add(pPais);


            // Insert
            comando.ExecuteNonQuery();
            comando.Dispose();
        }

        public void Atualizar(Cidade entidade)
        {
            string sqlAtualizar = "update Cidade set NomeCidade = ?, UF = ? where IdCidade = ?";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlAtualizar;

            OleDbParameter pNomeCidade = new OleDbParameter("NomeCidade", OleDbType.VarChar);
            pNomeCidade.Value = entidade.NomeCidade;
            comando.Parameters.Add(pNomeCidade);

            OleDbParameter pUF = new OleDbParameter("UF", OleDbType.VarChar);
            pUF.Value = entidade.UF;
            comando.Parameters.Add(pUF);

            OleDbParameter pIdCidade = new OleDbParameter("IdCidade", OleDbType.Integer);
            pIdCidade.Value = entidade.IdCidade;
            comando.Parameters.Add(pIdCidade);

            // Update
            comando.ExecuteNonQuery();
            comando.Dispose();
        }


        public Cidade BuscarPorId(int id)
        {
            Cidade registro = null;
            string sqlBuscar = "select * from cidade where IdCidade = " + id;

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlBuscar;

            // Select
            OleDbDataReader dr = comando.ExecuteReader();
            if (dr.Read())
            {
                registro = ConverterDataReaderParaObj(dr);
            }
            dr.Close();
            comando.Dispose();

            return registro;
        }

        private Cidade ConverterDataReaderParaObj(OleDbDataReader dr)
        {
            Cidade registro = new Cidade();
            registro.IdCidade = Int32.Parse(dr["IdCidade"].ToString());
            registro.NomeCidade = dr["NomeCidade"].ToString();
            registro.Pais = dr["Pais"].ToString();
            registro.UF = dr["UF"].ToString();

            return registro;
        }

        public List<Cidade> Listar()
        {
            String sqlConsulta = "select * from CIDADE order by NomeCidade";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlConsulta;

            // Select
            OleDbDataReader dr = comando.ExecuteReader();

            List<Cidade> cidades = new List<Cidade>();
            while (dr.Read())
            {
                Cidade cidade = ConverterDataReaderParaObj(dr);
                cidades.Add(cidade);
            }
            dr.Close();
            comando.Dispose();

            return cidades;
        }



        public void RemoverPorId(int id)
        {
            string sqlDeletar = "delete CIDADE where IdCidade = ?";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlDeletar;

            OleDbParameter pId = new OleDbParameter("IdCidade", OleDbType.VarChar);
            pId.Value = id;
            comando.Parameters.Add(pId);


            // Delete
            comando.ExecuteNonQuery();
            comando.Dispose();
        }

        public List<Cidade> ListarCidadesPorUF(string UF)
        {
            String sqlConsulta = "select * from CIDADE where UF = UPPER('"+UF+"') order by NomeCidade";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlConsulta;

            // Select
            OleDbDataReader dr = comando.ExecuteReader();

            List<Cidade> cidades = new List<Cidade>();
            while (dr.Read())
            {
                Cidade cidade = ConverterDataReaderParaObj(dr);
                cidades.Add(cidade);
            }
            dr.Close();
            comando.Dispose();

            return cidades;
        }

        public List<Cidade> ListarCidadesAeroportosPorUF(string UF)
        {
            String sqlConsulta = "select distinct CI.IdCIdade, NomeCidade, UF, PAIS "+
                                    "from CIDADE CI, AEROPORTO AE " +
                                    "where CI.IdCidade = AE.IdCidade " +
                                    "and CI.UF = UPPER('" + UF + "') order by NomeCidade";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlConsulta;

            // Select
            OleDbDataReader dr = comando.ExecuteReader();

            List<Cidade> cidades = new List<Cidade>();
            while (dr.Read())
            {
                Cidade cidade = ConverterDataReaderParaObj(dr);
                cidades.Add(cidade);
            }
            dr.Close();
            comando.Dispose();

            return cidades;
        }
    }
}